package com.example.vue20220225.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.vue20220225.dao.UserDao;
import com.example.vue20220225.model.Mynode;
import com.example.vue20220225.model.Power;
import com.example.vue20220225.model.Role;
import com.example.vue20220225.model.UserInfo;
import com.example.vue20220225.service.UserService;
import com.example.vue20220225.util.ExcelUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

@Service
public class UserServiceImpl implements UserService {

    @Resource
    UserDao userDao;

    @Override
    public Map<String, Object> list() {
        Map<String, Object> map = new HashMap<>();
        // 查询条件
        List<UserInfo> list = userDao.selectList(null);
        map.put("list",list);
        return map;
    }

    @Override
    public Map<String, Object> add(UserInfo userInfo) {
        Map<String, Object> map = new HashMap<>();
        // 判断id 是否为空
        int flag = 0;
        if(userInfo.getId() == null || userInfo.getId().equals("")){
            //  调用mybatis  的  插入方法   insert into sql语句
            flag = userDao.insert(userInfo);
        }else{
            // id 有值   修改用户
            flag = userDao.updateById(userInfo);
        }
        if(flag > 0){
            // 添加成功
            map.put("message","保存成功");
        }else{
            // 添加失败
            map.put("message","保存失败");
        }
        return map;
    }

    // 删除用户
    @Override
    @Transactional
    public Map<String, Object> deleteuser(Integer id) {
        Map<String, Object> map = new HashMap<>();
        int flag = 0;
        try {
            userDao.deleteById(id);
            userDao.deleteUserRole(id);
            flag = 1;
        }catch (Exception e){
            e.printStackTrace();
        }
        if(flag > 0){
            // 添加成功
            map.put("message","删除成功");
        }else{
            // 添加失败
            map.put("message","删除失败");
        }
        return map;
    }

    @Override
    public Map<String, Object> pagelist(UserInfo userInfo) {
        Map<String, Object> map = new HashMap<>();
        //  从前端传回  页码  和  每页显示条数
        Page<UserInfo> page = new Page<>(userInfo.getPage(),userInfo.getRow());
        Page<UserInfo> list = userDao.selectPage(page, null);
        //  getRecords  查询的 分页 用户数据
        List<UserInfo> records = list.getRecords();
        //  把查询出来的 数据  放到map中  key是users
        map.put("users",records);
        //  数据 最大条数  有多少条数据
        map.put("maxcount",list.getTotal());
        //  最大页
        map.put("maxtotal",list.getPages());
        return map;
    }


    public Map<String,Object> login(UserInfo userInfo){
        Map<String,Object> map = new HashMap<>();
        //QueryWrapper
        UserInfo user = userDao.login(userInfo);
        if(user == null){
            map.put("message","登录失败");
        }else{
            map.put("message","登录成功");
            map.put("userinfo",user);
        }
        return map;
    }

    //   查询用户对于的权限
    @Override
    public Map<String, Object> queryPowerlist(UserInfo userInfo) {
        Map<String,Object> map = new HashMap<>();
        List<Power> powerlist =  userDao.queryPowerlist(userInfo);
        //  一级菜单  和  二级菜单 分开循环
        List<Mynode> list = new ArrayList<>();
        Mynode first = null;
        for(Power p : powerlist){
            //  判断一级菜单  第一次循环 第四次循环
            //  我的数据  主键id 1 ，4 对应的  是一级菜单  2，3,5,6 对应的是二级菜单
            if(p.getParentId() == 0){
                first = new Mynode();
                first.setPowerId(p.getPowerId());
                first.setPowerName(p.getPowerName());
                first.setIndexId(p.getIndexId());
                first.setParentId(p.getParentId());
                list.add(first);
                for(Power p2 : powerlist){
                    if(p2.getParentId() == first.getPowerId()){
//                //  二级菜单
                        Power second = new Power();
                        second.setPowerId(p2.getPowerId());
                        second.setPowerName(p2.getPowerName());
                        second.setIndexId(p2.getIndexId());
                        second.setParentId(p2.getParentId());
                        second.setPowerUrl(p2.getPowerUrl());
                        List<Power> node = first.getNode();
                        node.add(second);
                    }
                }
            }
            // 第二次循环 第三次循环  5 ， 6 次
//            if(p.getParentId() == first.getPowerId()){
//                //  二级菜单
//                Power second = new Power();
//                second.setPowerId(p.getPowerId());
//                second.setPowerName(p.getPowerName());
//                second.setIndexId(p.getIndexId());
//                second.setParentId(p.getParentId());
//                second.setPowerUrl(p.getPowerUrl());
//                List<Power> node = first.getNode();
//                node.add(second);
//            }
        }
        map.put("list",list);
        return map;
    }

    @Override
    public Map<String, Object> queryUserlist(UserInfo userInfo) {
        Map<String,Object> map = new HashMap<>();
        //  查询参数  username
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        if(userInfo.getUsername() != null && !userInfo.getUsername().equals("")){
            queryWrapper.like("username",userInfo.getUsername());
            //  加入where username 条件  比较 传回的 username值
        }
        queryWrapper.orderByAsc("id");
        // 分页
        Page<UserInfo> page = new Page<>(userInfo.getPage(), userInfo.getRow());
        IPage<UserInfo> userlist = userDao.queryUserlist(page, queryWrapper);
        //  userlist  有没有 角色相关的数据
        map.put("users",userlist);
        return map;
    }

    @Override
    public Map<String, Object> queryroles() {
        Map<String,Object> map = new HashMap<>();
        List<Role> rolelist = userDao.queryroles();
        map.put("rolelist",rolelist);
        return map;
    }

    @Override
    public Map<String, Object> editUserRoll(UserInfo userInfo) {
        Map<String,Object> map = new HashMap<>();
        Integer count = userDao.checkUserRole(userInfo);
        // 判断当前用户 有没有角色对应的信息
        if(count > 0){
            // 有数据的话 修改
            Integer flag = userDao.editUserRoll(userInfo);
            if(flag < 1){
                map.put("message","修改角色失败");
            }else{
                map.put("message","修改角色成功");
            }
        }else{
            // 没有的话  增加一条想你想
            Integer flag = userDao.insertUserRoll(userInfo);
            if(flag < 1){
                map.put("message","修改角色失败");
            }else{
                map.put("message","修改角色成功");
            }
        }
        return map;
    }

    @Override
    public Map<String, Object> updateUserstats(UserInfo userInfo) {
        Map<String,Object> map = new HashMap<>();
        //  查询参数  username
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        //  where 条件  eq =
        queryWrapper.eq("id",userInfo.getId());
        //  调用mybatis plus 自带的方法
        Integer flag = userDao.update(userInfo,queryWrapper);
        if(flag < 1){
            map.put("message","修改状态失败");
        }else{
            map.put("message","修改状态成功");
        }
        return map;
    }

    @Override
    public Map<String, Object> queryrolespower(UserInfo userInfo) {
        Map<String,Object> map = new HashMap<>();
        //  查询参数  username
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        if(userInfo.getRoleName() != null && !userInfo.getRoleName().equals("")){
            queryWrapper.like("role_name",userInfo.getRoleName());
        }
        queryWrapper.groupBy("r.role_id","r.role_name");
        queryWrapper.orderByAsc("role_id");
        // 分页
        Page<Role> page = new Page<>(userInfo.getPage(), userInfo.getRow());
        IPage<Role> roles = userDao.queryrolespower(page, queryWrapper);
        //  userlist  有没有 角色相关的数据
        map.put("roles",roles);
        return map;
    }

    @Override
    public void importExcel( HttpServletResponse response) {
        List<UserInfo> list = userDao.selectList(null);
        List<String> titleList = Arrays.asList("序号","用户名称", "用户密码", "用户状态");
        ExcelUtil.uploadExcelAboutUser2(response,"apply.xlsx",titleList,list);
    }


}
